
// 数据拼接
module  data_consolidation
    (
        input           clk ,           
        input           rstn ,
        input [1:0]     din ,           // 输入数据（2位）
        input           din_en ,        // 数据有效位
        output [7:0]    dout ,          // 输出数据
        output          dout_en         // 输出有效位
     );

    // 定义数据存储器
    reg [7:0]            data_r ;

    // 状态计数
    reg [1:0]            state_cnt ;

    // 时序模型部分
    always @(posedge clk or negedge rstn) begin

        // 复位按钮按下，初始化寄存器数据
        if (!rstn) begin
            state_cnt     <= 'b0 ;
            data_r        <= 'b0 ;
        end

        // 数据有效位 为 1 ，开始拼接数据
        else if (din_en) begin

            // 拼接数量 + 1 （state_cnt 表示拼接的个数）
            state_cnt     <= state_cnt + 1'b1 ;    //数据计数

            // 数据左移（拼接数据）
            data_r        <= {data_r[5:0], din} ;  //数据拼接
        end

        // din en 为0 ，表示拼接完毕，复位拼接数量
        else begin
            state_cnt <= 'b0 ;
        end
    end

    // 定义输出数据
    assign dout          = data_r ;

    // data output en
    reg                  dout_en_r ;
    always @(posedge clk or negedge rstn) begin
        if (!rstn) begin
            dout_en_r       <= 'b0 ;
        end
        //计数为 3 且第 4 个数据输入时，同步输出数据输出使能信号
        else if (state_cnt == 2'd3 & din_en) begin  
            dout_en_r       <= 1'b1 ;
        end
        else begin
            dout_en_r       <= 1'b0 ;
        end
    end
    //这里不直接声明dout_en为reg变量，而是用相关寄存器对其进行assign赋值
    assign dout_en       = dout_en_r;

endmodule